package com.lml.jdk8.localdate.java8Time;

import java.time.LocalDate;
import java.time.Month;
import java.time.temporal.ChronoUnit;
import java.time.temporal.TemporalAccessor;
import java.time.temporal.TemporalQuery;

/**
 * @author luomingliang
 * @date 2021/9/12 20:56
 */
public class UtilDayQueryImpl implements TemporalQuery<Long> {
    /**
     * 需求：获取某一天距离下一个劳动节相隔天数的实现类
     *
     * @param temporal 时间
     * @return 距离下一个劳动节相隔的天数
     */
    @Override
    public Long queryFrom(TemporalAccessor temporal) {
        //1.TemporalAccessor是LocalDate和LocalDateTime的顶级父接口，相当于LocalDate就是这个接口的实现类，将temporal转换为LocalDate进行使用。
        LocalDate now = LocalDate.from(temporal);
        //2.封装当年的劳动节的时间
        LocalDate laborDay = LocalDate.of(now.getYear(), Month.MAY, 1);
        //3.判断当前时间是否已经超过了当年的劳动节，如果超过了当年的劳动节，则laborDay+1年
        if (now.isAfter(laborDay)) {
            laborDay = laborDay.plusYears(1);
        }
        //4.通过ChronoUnit的between方法来计算两个时间点的差额
        return ChronoUnit.DAYS.between(now, laborDay);
    }

    public static void main(String[] args) {
        //计算当前时间距离下一个劳动节还有多少天
        LocalDate now = LocalDate.now();
        //调用now的query方法，然后将我们自己的实现类UtilDayQueryImpl作为参数传入即可
        Long days = now.query(new UtilDayQueryImpl());
        System.out.println("当前时间是：" + now + "，距离下一个劳动节还有" + days + "天");
    }
}
